package com.tarena.lbs.coupon.consumer;


import com.tarena.lbs.common.event.QrCodeDeleteMessage;
import com.tarena.lbs.coupon.config.RabbitMQConfig;
import com.tarena.lbs.coupon.service.RedisService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.io.File;

@Component
@Slf4j
public class QrCodeDeleteConsumer {

    @Autowired
    private RedisService redisService;

    @Value("${file.upload-dir:E:/files}")
    private String uploadDir;

    /**
     * 监听死信队列，处理过期消息
     */
    @RabbitListener(queues = RabbitMQConfig.QR_DEAD_LETTER_QUEUE)
    public void processDeadLetterMessage(QrCodeDeleteMessage message) {
        try {
            log.info("收到二维码删除死信消息，开始处理：优惠券码={}, 文件路径={}",
                    message.getCouponCode(), message.getFilePath());

            // 1. 检查Redis中是否还有该优惠券码的记录
            String redisValue = redisService.getValue(message.getRedisKey());
            if (redisValue != null) {
                log.info("优惠券码 {} 在Redis中仍存在（可能被重新使用），跳过删除", message.getCouponCode());
                return;
            }

            // 2. 删除本地图片文件
            boolean deleteSuccess = deleteLocalFile(message.getFilePath());

            if (deleteSuccess) {
                log.info("成功删除二维码图片文件，优惠券码：{}，文件路径：{}",
                        message.getCouponCode(), message.getFilePath());
            } else {
                log.warn("删除二维码图片文件失败或文件不存在，优惠券码：{}，文件路径：{}",
                        message.getCouponCode(), message.getFilePath());
            }

        } catch (Exception e) {
            log.error("处理二维码删除死信消息异常：优惠券码={}", message.getCouponCode(), e);
            // 这里可以加入重试机制，比如将消息重新放入队列或记录到数据库人工处理
        }
    }

    /**
     * 删除本地文件
     */
    private boolean deleteLocalFile(String filePath) {
        try {
            if (filePath == null || filePath.trim().isEmpty()) {
                log.warn("文件路径为空，无法删除");
                return false;
            }

            File file = new File(filePath);
            if (file.exists()) {
                if (file.delete()) {
                    log.info("成功删除文件：{}", filePath);
                    return true;
                } else {
                    log.warn("删除文件失败：{}", filePath);
                    return false;
                }
            } else {
                log.warn("文件不存在，无需删除：{}", filePath);
                return true; // 文件不存在也算"删除成功"
            }
        } catch (SecurityException e) {
            log.error("删除文件权限不足：{}", filePath, e);
            return false;
        } catch (Exception e) {
            log.error("删除文件异常：{}", filePath, e);
            return false;
        }
    }
}